package jupitermouse.site.juc.demo.aqs.cyclibarrier;

import jupitermouse.site.juc.demo.util.TimeUtils;

import java.util.concurrent.CyclicBarrier;

/**
 * <p>
 *   循环屏障，等待所有数据导入完成后进行后面的操作。
 *   CountDownLatch：一个或者多个线程，等待其他多个线程完成某件事情之后才能执行；
 *   CyclicBarrier：多个线程互相等待，直到到达同一个同步点，再继续一起执行。
 * 对于CountDownLatch来说，重点是“一个线程（多个线程）等待”，而其他的N个线程在完成“某件事情”之后，可以终止，也可以等待。
 * 而对于CyclicBarrier，重点是多个线程，在任意一个线程没有完成，所有的线程都必须互相等待，然后继续一起执行。
 * </p>
 *
 * @author jupiter
 */
public class CyclicBarrierApp extends Thread{

    @Override
    public void run() {
        System.out.println("进行数据分析");
    }

    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new CyclicBarrierApp());
        new Thread(new DataImportThread(cyclicBarrier, "file1")).start();;
        new Thread(new DataImportThread(cyclicBarrier, "file2")).start();;
        new Thread(new DataImportThread(cyclicBarrier, "file3",50000)).start();;
    }
}
